home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-04
/
wtjmarch.zip
/
WINSORT.ZIP
/
WINSORT.C
Wrap
Text File
|
1992-02-21
|
5KB
|
178 lines
/****keyword-flag*** "%v %f %n" */
#define WINAPP 1
#if WINAPP == 1
#include <windows.h>
#else
extern int _stklen = 32000;
#endif
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <string.h>
#include <bcdconv.h>
#define ASCII_ZIP_LENGTH 5
#define ASCII_PLUS4_LENGTH 4
#define ASCII_RECNUM_LENGTH 6
#define ASCII_REC_LENGTH (ASCII_ZIP_LENGTH + 1 + \
ASCII_PLUS4_LENGTH + 1 + ASCII_RECNUM_LENGTH + 2)
#define BCD_ZIP_LENGTH ((ASCII_ZIP_LENGTH+1+ASCII_PLUS4_LENGTH)/2)
#define BCD_RECNUM_LENGTH (ASCII_RECNUM_LENGTH/2)
typedef struct
{
char zip[BCD_ZIP_LENGTH];
char recnum[BCD_RECNUM_LENGTH];
} SortRecord;
typedef struct
{
char zip[ASCII_ZIP_LENGTH];
char filler1;
char plus4[ASCII_PLUS4_LENGTH];
char filler2;
char recnum[ASCII_RECNUM_LENGTH];
char filler3[2];
} AsciiRecord;
void Megasort(unsigned SortRecord huge *NumArray,unsigned long
ArraySize,unsigned KeyLength);
#define ITEM_COUNT 100
#if WINAPP == 1
int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR
lpszCmdLine, int cmdShow) #else
main(int argc, char **argv[])
#endif
{
unsigned SortRecord huge * RecArray;
long RecordCount;
long i;
char * CmdLine;
char * BlankPos;
char * InFileName;
char * OutFileName;
FILE *InFile;
FILE *OutFile;
BCD zip;
BCD recnum;
AsciiRecord ascii_temp_rec[ITEM_COUNT];
char temp_zip[ASCII_ZIP_LENGTH+ASCII_PLUS4_LENGTH+1+1];
char ascii_zip[ASCII_ZIP_LENGTH+1+ASCII_PLUS4_LENGTH+1];
char ascii_recnum[ASCII_RECNUM_LENGTH+1];
int item;
InFileName = getenv("WINSORT_IN");
OutFileName = getenv("WINSORT_OUT");
InFile = fopen(InFileName,"rb");
setvbuf(InFile,NULL,_IOFBF,32000);
fseek(InFile,0,SEEK_END);
RecordCount = ftell(InFile)/ASCII_REC_LENGTH;
fseek(InFile,0,SEEK_SET);
RecArray = (unsigned SortRecord huge
*)farcalloc(RecordCount,sizeof(SortRecord)); for (i = 0; i <
RecordCount; i ++)
{
item = i % ITEM_COUNT;
if (item == 0)
fread((char
*)&ascii_temp_rec,sizeof(AsciiRecord),ITEM_COUNT,InFile);
strcpy(temp_zip,"0");
memcpy(temp_zip+1,ascii_temp_rec[item].zip,ASCII_ZIP_LENGTH);
memcpy(temp_zip+1+ASCII_ZIP_LENGTH,ascii_temp_rec[item].plus4,ASC
II_PLUS4_LENGTH);
ascii_to_BCD(RecArray[i].zip,temp_zip,ASCII_ZIP_LENGTH+ASCII_PLUS
4_LENGTH);
ascii_to_BCD(RecArray[i].recnum,ascii_temp_rec[item].recnum,ASCII
_RECNUM_LENGTH); }
fclose(InFile);
Megasort(RecArray,RecordCount,BCD_ZIP_LENGTH);
OutFile = fopen(OutFileName,"wb");
setvbuf(OutFile,NULL,_IOFBF,32000);
for (item = 0; item < 10; item ++)
{
ascii_temp_rec[item].filler1 = '-';
ascii_temp_rec[item].filler2 = ' ';
strncpy(ascii_temp_rec[item].filler3,"\r\n",2);
}
for (i = 0; i < RecordCount; i ++)
{
item = i % ITEM_COUNT;
BCD_to_ascii(ascii_zip,RecArray[i].zip,ASCII_ZIP_LENGTH+ASCII_PLU
S4_LENGTH+1);
BCD_to_ascii(ascii_recnum,RecArray[i].recnum,ASCII_RECNUM_LENGTH);
strncpy(ascii_temp_rec[item].zip,ascii_zip,ASCII_ZIP_LENGTH);
strncpy(ascii_temp_rec[item].plus4,ascii_zip+ASCII_ZIP_LENGTH,ASC
II_PLUS4_LENGTH);
strncpy(ascii_temp_rec[item].recnum,ascii_recnum,ASCII_RECNUM_LEN
GTH); if (item == ITEM_COUNT - 1)
fwrite((char
*)&ascii_temp_rec,sizeof(AsciiRecord),ITEM_COUNT,OutFile); }
if (item != ITEM_COUNT - 1)
fwrite((char
*)&ascii_temp_rec,sizeof(AsciiRecord),item+1,OutFile);
fclose(OutFile);
farfree((unsigned SortRecord far *)RecArray);
#if WINAPP == 1
ExitWindows(0,0);
#endif
}
void Megasort(unsigned SortRecord huge *RecArray,unsigned long
ArraySize, unsigned KeyLength) {
unsigned char m;
int cum;
int i;
long j;
long BucketCount [ 256 ];
long BucketPosition[ 256 ];
unsigned SortRecord huge *TempRecArray;
unsigned SortRecord huge *Exchange;
unsigned long ArrayIndex;
TempRecArray = (unsigned SortRecord huge *)
farmalloc (sizeof(SortRecord) * ArraySize);
if (TempRecArray == NULL)
{
exit(1);
}
for (i = KeyLength-1; i >= 0; i--)
{
_fmemset(BucketCount,0,256*sizeof(long));
for (j = 0; j < ArraySize; j++)
{
m = *((char huge *)&RecArray[ j ]+i);
++BucketCount[m];
}
BucketPosition[0] = 0;
for (cum = 1; cum < 256; cum++)
BucketPosition[ cum ] = BucketCount[ cum-1 ] +
BucketPosition[ cum-1 ];
for (j = 0; j < ArraySize; j++)
{
m = *((char huge *)&RecArray[ j ]+i);
ArrayIndex = BucketPosition[m];
TempRecArray[ArrayIndex] = RecArray[j];
++BucketPosition[m];
}
Exchange = RecArray;
RecArray = TempRecArray;
TempRecArray = Exchange;
}
if (KeyLength % 2 != 0)
{
for (i = 0; i < ArraySize; i ++)
{
_fmemcpy((char far *)&TempRecArray[i],(char far
*)&RecArray[i],sizeof(SortRecord)); }
farfree((unsigned SortRecord far *)RecArray);
}
else
farfree((unsigned SortRecord far *)TempRecArray);
}